package br.com.ufc.quixada.util;

import java.util.Date;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Luis Lima
 */
public class UtilLocExpress {

    //-------- Valida CPF ou CNPJ
    public static boolean valida_CpfCnpj(String s_aux) {
        //------- Rotina para CPF        
        if (s_aux.length() == 11) {
            int d1, d2;
            int digito1, digito2, resto;
            int digitoCPF;
            String nDigResult;
            d1 = d2 = 0;
            digito1 = digito2 = resto = 0;
            for (int n_Count = 1; n_Count < s_aux.length() - 1; n_Count++) {
                digitoCPF = Integer.valueOf(s_aux.substring(n_Count - 1, n_Count)).intValue();
                //--------- Multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante. 
                d1 = d1 + (11 - n_Count) * digitoCPF;
                //--------- Para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior. 
                d2 = d2 + (12 - n_Count) * digitoCPF;
            }
            //--------- Primeiro resto da divisão por 11. 
            resto = (d1 % 11);
            //--------- Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior. 
            if (resto < 2) {
                digito1 = 0;
            } else {
                digito1 = 11 - resto;
            }
            d2 += 2 * digito1;
            //--------- Segundo resto da divisão por 11. 
            resto = (d2 % 11);
            //--------- Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior. 
            if (resto < 2) {
                digito2 = 0;
            } else {
                digito2 = 11 - resto;
            }
            //--------- Digito verificador do CPF que está sendo validado. 
            String nDigVerific = s_aux.substring(s_aux.length() - 2, s_aux.length());
            //--------- Concatenando o primeiro resto com o segundo. 
            nDigResult = String.valueOf(digito1) + String.valueOf(digito2);
            //--------- Comparar o digito verificador do cpf com o primeiro resto + o segundo resto. 
            return nDigVerific.equals(nDigResult);
        } //-------- Rotina para CNPJ         
        else if (s_aux.length() == 14) {
            int soma = 0, aux, dig;
            String cnpj_calc = s_aux.substring(0, 12);
            char[] chr_cnpj = s_aux.toCharArray();
            //--------- Primeira parte 
            for (int i = 0; i < 4; i++) {
                if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
                    soma += (chr_cnpj[i] - 48) * (6 - (i + 1));
                }
            }
            for (int i = 0; i < 8; i++) {
                if (chr_cnpj[i + 4] - 48 >= 0 && chr_cnpj[i + 4] - 48 <= 9) {
                    soma += (chr_cnpj[i + 4] - 48) * (10 - (i + 1));
                }
            }
            dig = 11 - (soma % 11);
            cnpj_calc += (dig == 10 || dig == 11)
                    ? "0" : Integer.toString(dig);
            //--------- Segunda parte 
            soma = 0;
            for (int i = 0; i < 5; i++) {
                if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
                    soma += (chr_cnpj[i] - 48) * (7 - (i + 1));
                }
            }
            for (int i = 0; i < 8; i++) {
                if (chr_cnpj[i + 5] - 48 >= 0 && chr_cnpj[i + 5] - 48 <= 9) {
                    soma += (chr_cnpj[i + 5] - 48) * (10 - (i + 1));
                }
            }
            dig = 11 - (soma % 11);
            cnpj_calc += (dig == 10 || dig == 11)
                    ? "0" : Integer.toString(dig);
            return s_aux.equals(cnpj_calc);
        } else {
            return false;
        }
    }
    
    public static boolean validEmail(String email) {
        //Metodo de validacao de email
        Pattern p = Pattern.compile("^[\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+[a-zA-Z]{2,7}$");        
        Matcher m = p.matcher(email);        
        if (m.find()) {
            //Email é valido");
            return true;
        } else {
            //Email é inválido");
            return false;
        }        
    }
    
    public static boolean validaData(String data) {

        //Data não digitada correta(xx/xx/xxxx)!
        if (data.length() != 10) {
            return false;
        }
        
        for (int i = 0; i < data.length(); i++) {

            //Data não digitada correta(sem ser numerico)!
            if (i != 2 && i != 5) {
                if (isNumeber(data.charAt(i)) != true) {
                    return false;
                }
                
            }
            //Data não digitada correta(sem -)!
            if ((i == 2 || i == 5) && data.charAt(i) != '/') {
                return false;
            }
        }
        //Data invalida(mais de 100 anos)!
        if (Integer.parseInt(data.substring(6)) < 1910 || Integer.parseInt(data.substring(6)) > 1995) {
            return false;
        } else {
            //Data invalida(mes invalido)!
            if (Integer.parseInt(data.substring(3, 5)) > 12 || Integer.parseInt(data.substring(3, 5)) < 1) {
                return false;
            } else {
                //Fevereiro bisesto(anos mutiplos de 4)!
                if (Integer.parseInt(data.substring(6)) % 4 == 0) {
                    //Data invalida(dias valido de fevereiro bisesto)!
                    if (Integer.parseInt(data.substring(3, 5)) == 2 && Integer.parseInt(data.substring(0, 2)) > 29) {
                        return false;
                    }
                } else {
                    //Data invalida(dias valido de fevereiro)!
                    if (Integer.parseInt(data.substring(3, 5)) == 2 && Integer.parseInt(data.substring(0, 2)) > 28) {
                        return false;
                    }
                }
                //Data mes de 30 dias(par e < 7 ou impar > 8)!
                if ((Integer.parseInt(data.substring(3, 5)) % 2 == 0 && Integer.parseInt(data.substring(3, 5)) < 07) || Integer.parseInt(data.substring(3, 5)) % 2 == 1 && Integer.parseInt(data.substring(3, 5)) > 8) {
                    //Data invalida(mes 30dias - dias inexistente)!
                    if (Integer.parseInt(data.substring(0, 2)) > 30) {
                        return false;
                    }
                } else {
                    //Data invalida(mes 31dias - dias inexistente)!
                    if (Integer.parseInt(data.substring(0, 2)) > 31) {
                        return false;
                    }
                }
                
            }
        }
        //data Valida
        return true;
    }

    public static boolean validaDataAluguel(String data) {

        //Data não digitada correta(xx/xx/xxxx)!
        if (data.length() != 10) {
            return false;
        }

        for (int i = 0; i < data.length(); i++) {

            //Data não digitada correta(sem ser numerico)!
            if (i != 2 && i != 5) {
                if (isNumeber(data.charAt(i)) != true) {
                    return false;
                }

            }
            //Data não digitada correta(sem -)!
            if ((i == 2 || i == 5) && data.charAt(i) != '/') {
                return false;
            }
        }
        //Data invalida(anos anteriores)!
        if (Integer.parseInt(data.substring(6)) < 2011) {
            return false;
        } else {
            //Data invalida(mes invalido)!
            if (Integer.parseInt(data.substring(3, 5)) > 12 || Integer.parseInt(data.substring(3, 5)) < 1) {
                return false;
            } else {
                //Fevereiro bisesto(anos mutiplos de 4)!
                if (Integer.parseInt(data.substring(6)) % 4 == 0) {
                    //Data invalida(dias valido de fevereiro bisesto)!
                    if (Integer.parseInt(data.substring(3, 5)) == 2 && Integer.parseInt(data.substring(0, 2)) > 29) {
                        return false;
                    }
                } else {
                    //Data invalida(dias valido de fevereiro)!
                    if (Integer.parseInt(data.substring(3, 5)) == 2 && Integer.parseInt(data.substring(0, 2)) > 28) {
                        return false;
                    }
                }
                //Data mes de 30 dias(par e < 7 ou impar > 8)!
                if ((Integer.parseInt(data.substring(3, 5)) % 2 == 0 && Integer.parseInt(data.substring(3, 5)) < 07) || Integer.parseInt(data.substring(3, 5)) % 2 == 1 && Integer.parseInt(data.substring(3, 5)) > 8) {
                    //Data invalida(mes 30dias - dias inexistente)!
                    if (Integer.parseInt(data.substring(0, 2)) > 30) {
                        return false;
                    }
                } else {
                    //Data invalida(mes 31dias - dias inexistente)!
                    if (Integer.parseInt(data.substring(0, 2)) > 31) {
                        return false;
                    }
                }

            }
        }
        //data Valida
        return true;
    }

    public static boolean validaDataEntrega(String data) {

        String datamenor;
        Date hoje = new Date(System.currentTimeMillis());
        if(hoje.getDate()<10){
            if(hoje.getMonth()<10){
                datamenor = "0"+hoje.getDate()+"/0"+(hoje.getMonth()+1)+"/"+hoje.getYear();
            }else{
                datamenor = "0"+hoje.getDate()+"/"+(hoje.getMonth()+1)+"/"+hoje.getYear();
            }
        }else{
            if(hoje.getMonth()<10){
                datamenor = hoje.getDate()+"/0"+(hoje.getMonth()+1)+"/"+hoje.getYear();
            }else{
                datamenor = hoje.getDate()+"/"+(hoje.getMonth()+1)+"/"+hoje.getYear();
            }
        }


        System.out.println(datamenor);
        System.out.println(data);

        int dias = 0;
        dias = (Integer.parseInt(data.substring(0, 2))) - (Integer.parseInt(datamenor.substring(0, 2)));
        
        //Se sor mesmo ano e mesmo mes calcula o dia subtraindo o maior pelo menor
        if (Integer.parseInt(datamenor.substring(6)) == Integer.parseInt(data.substring(6))){
            if (Integer.parseInt(datamenor.substring(3, 5)) == Integer.parseInt(data.substring(3, 5))){
                dias = (Integer.parseInt(data.substring(0, 2))) - (Integer.parseInt(datamenor.substring(0, 2)));
            }else{
                dias = (Integer.parseInt(datamenor.substring(0, 2))) + 30 - (Integer.parseInt(data.substring(0, 2)));
            }
        }

        System.out.println("Dias: "+dias);
        System.out.println("Dias: "+Integer.parseInt(data.substring(0, 2)));
        System.out.println("Dias: "+Integer.parseInt(datamenor.substring(0, 2)));

        if(dias > 3 || dias < 1){
            return false;
        }else{
            return true;
        }

    }

    public static boolean validaDataDevolucao(String datad, String datae) {

        System.out.println(datad);
        System.out.println(datae);

        int dias = 0;

        //Se sor mesmo ano e mesmo mes calcula o dia subtraindo o maior pelo menor
        if (Integer.parseInt(datae.substring(6)) == Integer.parseInt(datad.substring(6))){
            if (Integer.parseInt(datae.substring(3, 5)) == Integer.parseInt(datad.substring(3, 5))){
                dias = Integer.parseInt(datad.substring(0, 2)) - Integer.parseInt(datae.substring(0, 2));
            }else{
                dias = Integer.parseInt(datae.substring(0, 2)) + 30 - Integer.parseInt(datad.substring(0, 2));
            }
        }

        if(dias > 10 || dias < 1){
            return false;
        }else{
            return true;
        }
    }
    
    public static int calcularDiasDatas(String dataentrega, String datadevolucao) {

        /*//Date hoje = new Date(System.currentTimeMillis());
        StringBuffer sbdatamenor = new StringBuffer(dataentrega);
        sbdatamenor.reverse();
        dataentrega = sbdatamenor.toString();

        StringBuffer sbdatamaior = new StringBuffer(datadevolucao);
        sbdatamaior.reverse();
        datadevolucao = sbdatamaior.toString();
        */

        int dias = 0;
        System.out.println("Calculos Dias:"+dias);
        //Se sor mesmo ano e mesmo mes calcula o dia subtraindo o maior pelo menor
        if (Integer.parseInt(dataentrega.substring(6)) == Integer.parseInt(datadevolucao.substring(6))){
            if (Integer.parseInt(dataentrega.substring(3, 5)) == Integer.parseInt(datadevolucao.substring(3, 5))){
                dias = Integer.parseInt(datadevolucao.substring(0, 2)) - Integer.parseInt(dataentrega.substring(0, 2));
            }else{
                dias = Integer.parseInt(dataentrega.substring(0, 2)) + 30 - Integer.parseInt(datadevolucao.substring(0, 2));
            }
        }

        return dias;
    }
    
    public static String createRandomString(int length) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        while (sb.length() < length) {
            sb.append(Integer.toHexString(random.nextInt()));
        }
        return sb.toString();
    }
    
    private static boolean isNumeber(char a) {
        
        if (a == '0' || a == '1' || a == '2' || a == '3' || a == '4' || a == '5'
                || a == '6' || a == '7' || a == '8' || a == '9') {
            return true;
        }
        return false;
    }
    
    public static String precoFormater(double preco) {
        java.text.DecimalFormat df = new java.text.DecimalFormat("R$ ###,###,##0.00");
        return df.format(preco);
    }
}
